#include <iostream>
using namespace std;

using i16_t = short;
using u16_t = unsigned short;

int main() {
  char sb = -128;         // char通常有符号
  unsigned char ub = sb;  // 等宽的转型不改变位模式
  cout << "i8 : " << (int)sb << endl;  // 转型是避免输出为字符
  cout << "u8 : " << (unsigned)ub << endl;
  cout << "i16: " << (i16_t)sb << ' ' << (i16_t)ub << endl;
  cout << "u16: " << (u16_t)sb << ' ' << (u16_t)ub << endl;
}
/**
 * 加宽转型时，高位需要适当填充。原则是保持数值不变。
 * 有符号数执行符号扩展（sign extension）。
 * 无符号数执行零位扩展（zero extension）。
 * 
 * 如果同时还涉及 signed -> unsigned 或 unsigned -> signed ，
 * 先加宽、再改变数据解释方式。
 * 
 * 比如 char -> unsigned short 相当于 (unsigned short)(short)c;
 */